#ifndef SERIALPORTCONNECTION_H
#define SERIALPORTCONNECTION_H

#include <QDialog>
#include <QSerialPort>//串口的设置和操作类
#include <QSerialPortInfo>//该类是一个串口的辅助类类，提供主要是提供系统已经存在串口的信息。
struct sendMessage
{
    unsigned char slaveId;
    unsigned char codeID;//功能码
    unsigned char startAddressH;//起始地址高8位
    unsigned char startAddressL;//起始地址低8位
    unsigned char dataNumberH;//数据个数高8位
    unsigned char dataNumberL;//数据个数低8位
};
struct CRC16{

    unsigned char CRC16H;
    unsigned char CRC16L;

};

namespace Ui {
class SerialPortConnection;
}

class SerialPortConnection : public QDialog
{
    Q_OBJECT
signals://串口信号
    void dataReceived(const QByteArray &data);
    void errorOccurred(const QString &error);//串口打开失败信号
    void portOpened(bool status);
public:
    explicit SerialPortConnection(QWidget *parent = nullptr);
    ~SerialPortConnection();
    static SerialPortConnection * instance();

private slots:
    void handleReadyRead();
    void handleError(QSerialPort::SerialPortError error);

private:
    Ui::SerialPortConnection *ui;
    QSerialPort *m_serialPort;//串口类对象
    QString m_portName;//存储串口名称
    QSerialPort::BaudRate m_baudRate;//波特率
    QSerialPort::DataBits m_dataBits;//数据位
    QSerialPort::StopBits m_stopBits;//停止位
    QSerialPort::Parity m_parity;//校验位
    QSerialPort::FlowControl m_flowControl;//流控制模式

    QByteArray sendModsimData;
    quint8 slaveAddress;
    quint8 functionCode;
    quint16 startAddress;
    quint16 numRegisters;
public:
    // 串口配置方法
    bool openSerialPort();//打开串口
    void closeSerialPort();//关闭串口
    void setPortName(const QString &portName);//设置串口名字
    void setBaudRate(QSerialPort::BaudRate baudRate);//设置波特率
    void setDataBits(QSerialPort::DataBits dataBits);//设置数据位
    void setStopBits(QSerialPort::StopBits stopBits);//设置停止位
    void setParity(QSerialPort::Parity parity);//设置校验位
    void setFlowControl(QSerialPort::FlowControl flowControl);//设置控制模式
    // 数据操作
    qint64 writeData(const QByteArray &data);
    // 获取可用串口列表
    static QStringList availablePorts();
    void initSerialport();
    void readModsimData();
    void initQByteArrayData(QByteArray& Data);
    quint16 caculateCRC16(QByteArray &Data);
    void initSendMessageO(quint8 &slaveAddress,
    quint8 &functionCode,
    quint16 &startAddress,
    quint16 &numRegisters);
private slots:
    void receiveModsimData();
};

#endif // SERIALPORTCONNECTION_H
